package com.thx.information.dao;

import com.thx.common.orm.PaginationDao;
import com.thx.information.ColumnSystemType;
import com.thx.information.model.InfoColumn;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;

@Repository
public class ColumnDao extends PaginationDao<InfoColumn> {

  private static final Logger logger = LoggerFactory.getLogger(ColumnDao.class);

  // /**
  // * 查询栏目列表sql语句 建立日期 : Apr 23, 2013 <br>
  // * 作者 : 王阿敏<br>
  // *
  // * @param info
  // * @return
  // */
  // public String getHql(InfoColumn info) {
  // String hql = "from InfoColumn c where 1=1";
  // if (info.getColumnId() != null) {
  // hql += " and c.columnId = " + info.getColumnId();
  // }
  // if (StringUtils.isNotBlank(info.getColumnName())) {
  // hql += " and c.columnName like '%" + info.getColumnName() + "%'";
  // }
  // if (info.getEnterpriseId() != null) {
  // hql += "and c.enterpriseId = " + info.getEnterpriseId();
  // }
  // if (StringUtils.isNotBlank(info.getIsPublic())) {
  // hql += "and c.isPublic=" + info.getIsPublic();
  // }
  // hql += " order by isPublic desc,createTime desc,columnOrder";
  // return hql;
  // }

  /**
   * 根据栏目名称查询栏目分类.
   * 
   * @param columnName 栏目名称,不能为空
   * @return 栏目分类
   */
  public InfoColumn queryByName(String columnName) {
    String hql = "from InfoColumn where columnName = ?";
    List<InfoColumn> list = createQuery(hql, new Object[] {columnName}).list();
    return list != null && list.size() > 0 ? list.get(0) : null;
  }

  /**
   * 根据是否公共查询租户分类.
   * 
   * @param ifcommon 是否公共
   * @return 多条符合，返回第一条
   */
  public InfoColumn queryByIscommon(String ifcommon) {
    String hql = "from InfoColumn where isCommon = ?";
    List<InfoColumn> list = this.createQuery(hql, new Object[] {ifcommon}).list();
    return list != null && list.size() > 0 ? list.get(0) : null;
  }

  /**
   * 根据企业租户id、是发布、是系统默认条件查询租户所有信息分类.
   * 
   * @param enterpriseId 所属企业租户id,不能为空
   * @param isPublic 是否发布,可以为空
   * @param columnName 分类名称,可以为空
   * @return 租户所有信息分类
   */
  public List<InfoColumn> findAllByEnterpriseAttributes(Long enterpriseId, String isPublic,
      String columnName) {
    StringBuffer hql = new StringBuffer();
    hql.append("from InfoColumn ");
    List<Object> objs = new ArrayList<Object>();
    this.generateByEnterpriseConditionsAndIssystem(enterpriseId, isPublic, columnName, hql, objs);
    return this.createQuery(hql.toString(), objs.toArray()).list();
  }

  /**
   * 根据企业租户id、是发布、是系统默认条件查询租户所有信息分类数量.
   * 
   * @param enterpriseId 所属企业租户id,不能为空
   * @param isPublic 是否发布,可以为空
   * @param columnName 分类名称,可以为空
   * @return 租户所有信息分类数量
   */
  public int findAllCountByEnterpriseAttributes(Long enterpriseId, String isPublic,
      String columnName) {
    StringBuffer hql = new StringBuffer();
    hql.append("select count(*) from InfoColumn ");
    List<Object> objs = new ArrayList<Object>();
    this.generateByEnterpriseConditionsAndIssystem(enterpriseId, isPublic, columnName, hql, objs);
    Object obj = this.createQuery(hql.toString(), objs.toArray()).uniqueResult();
    return obj != null ? Integer.parseInt(obj.toString()) : 0;
  }

  /**
   * 根据企业租户id、是发布、是系统默认条件查询租户所有信息分类分页数据.
   * 
   * @param enterpriseId 所属企业租户id,不能为空
   * @param isPublic 是否发布,可以为空
   * @param columnName 分类名称,可以为空
   * @return 租户所有信息分类分页数据
   */
  public List<InfoColumn> findByEnterpriseAttributes(Long enterpriseId, String isPublic,
      String columnName) {
    StringBuffer hql = new StringBuffer();
    hql.append("from InfoColumn ");
    List<Object> objs = new ArrayList<Object>();
    this.generateByEnterpriseConditionsAndIssystem(enterpriseId, isPublic, columnName, hql, objs);
    return this.findPageList(hql.toString(), objs.toArray());
  }

  /**
   * 根据组合条件组装sql语句,.
   * 
   * select * from info_column where ((enterprise_id = 181 and is_public =1) or (is_system = 1)) and column_name like '%%' order by is_system ,column_order,create_time desc
   * @param enterpriseId 所属企业租户id,不能为空
   * @param isPublic 是否发布,不能为空
   * @param columnName 分类名称,可以为空
   * @param hql 拼装语句
   * @param objs 拼装参数
   * @return hql objs 为双向返回参数
   */
  private void generateByEnterpriseConditionsAndIssystem(Long enterpriseId, String isPublic, String columnName,
      StringBuffer hql, List<Object> objs) {
    if (enterpriseId != null && enterpriseId != 0) {
      hql.append(" where ((enterprise_id = ? ");
      objs.add(enterpriseId);
      if (StringUtils.isNotBlank(isPublic)) {
        hql.append(" and isPublic = ? ");
        objs.add(isPublic);
      }
      hql.append(" ) or (is_system = " + ColumnSystemType.YES.ordinal() + ")) ");
      if (StringUtils.isNotBlank(columnName)) {
        hql.append(" and columnName like ? ");
        objs.add("%" + columnName + "%");
      }
      hql.append(" order by isSystem,columnOrder,createTime desc ");
    }
  }

  // /**
  // * @创建日期 2013-4-28<br>
  // * @作者: wangamin <br>
  // * @描述: 查询所有栏目信息总量<br>
  // */
  // @SuppressWarnings("unchecked")
  // public int queryCount(InfoColumn info) {
  // String hql = "select count(*) from InfoColumn c where (c.enterpriseId = ? or c.isSystem = ?)";
  // if (info.getColumnName() != null) {
  // hql += "and c.columnName like '%" + info.getColumnName() + "%'";
  // }
  // Object obj = createQuery(hql, new Object[] {info.getEnterpriseId(), OAConstant.IS_SYSTME})
  // .uniqueResult();
  // if (obj != null) {
  // return Integer.parseInt(obj.toString());
  // } else {
  // return 0;
  // }
  // }
  //
  // /**
  // * @创建日期 2013-4-28<br>
  // * @作者: wangamin <br>
  // * @描述: 不带参查询所有栏目信息<br>
  // */
  // @SuppressWarnings("unchecked")
  // public List<InfoColumn> queryAll(Long enterpriseId, String ifSee) {
  // String hql_ent;
  // if (StringUtils.isNotBlank(ifSee)) {
  // hql_ent = "from InfoColumn i where 1=1 and i.enterpriseId = ? and i.isPublic='"
  // + OAConstant.IS_PUBLIC + "' order by i.createTime desc";
  // } else {
  // hql_ent = "from InfoColumn i where 1=1 and i.enterpriseId = ? order by i.createTime desc";
  // }
  // List<InfoColumn> list = createQuery(hql_ent, new Object[] {enterpriseId}).list();
  //
  // String hql_system = "from InfoColumn i where i.isSystem = ? ";
  // List<InfoColumn> columnListOfSystem =
  // createQuery(hql_system, new Object[] {OAConstant.IS_SYSTME}).list();
  // List<InfoColumn> total = new ArrayList<InfoColumn>();
  //
  // total.addAll(columnListOfSystem);
  // total.addAll(list);
  // return total;
  // }

}
